package com.example.emos.wx.config.timedtask;

import cn.hutool.core.date.DateUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.example.emos.wx.service.TbHolidaysService;
import lombok.extern.log4j.Log4j2;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Log4j2
@Component
public class CalendarScheduledTask {

    @Value("${emos.calendar.url}")
    private String url;

    @Value("${emos.calendar.app_id}")
    private String addId;

    @Value("${emos.calendar.app_secret}")
    private String appSecret;

    @Autowired
    private TbHolidaysService holidaysService;

    /**
     * 每年12月28日 01:00:00 同步下一年特殊节假日和特殊工作日
     */
    @Scheduled(cron = "0 0 1 28 12 ?")
    private void getCalendarInfo() {
        // 下一年
        int year = DateUtil.date().year() + 1;
        log.info("{} 开始更新 {} 年的特殊节假日与特殊工作日", DateUtil.now(), year);
        try {
            String reqUrl = "https://www.mxnzp.com/api/holiday/list/year/" + year;
            Map<String, Object> paramMap = new HashMap<>();
            paramMap.put("ignoreHoliday", false);
            paramMap.put("app_id", "tfnxkhhrqgt9lxev");
            paramMap.put("app_secret", "K0QxZFR5WjFiMEV0RzdHOENwSmRpQT09");
            String res = HttpUtil.get(reqUrl, paramMap);
            // 1、转为JSON对象
            JSONObject json = JSONUtil.parseObj(res);
            // 2、获取data数据
            JSONArray jsonArray = json.get("data", JSONArray.class);
            // 2.1、将date转为数组，里面有十二个月的数据
            List<JSONObject> jsonObjects = JSONUtil.toList(jsonArray, JSONObject.class);

            for (JSONObject jsonObject : jsonObjects) {
                // 3、取出一个月的数据
                JSONArray jsonArray1 = jsonObject.get("days", JSONArray.class);
                List<JSONObject> jsonObjectList = JSONUtil.toList(jsonArray1, JSONObject.class);

                // 4、遍历这一个月的数据。
                for (JSONObject object : jsonObjectList) {
                    if ("2".equals(object.getStr("type"))) {
                        HashMap<String, Object> map = new HashMap<>();
                        map.put("date", object.getStr("date"));
                        holidaysService.saveHoliday(map);
                    }
                }
            }
            log.info("{} 更新完成", DateUtil.now());
        } catch (RuntimeException e) {
            log.error("更新日历信息时出现异常: {}", e.getMessage());
            e.printStackTrace();
        }
    }
}
